import { nanoid } from "nanoid"
import axios from "axios"
/* 关于用户的共享数据 */
export default {
    /* 开启命名空间 */
    namespaced: true,

    /* 数据 */
    state: {
        /* 是否开启消息推送 */
        isMsgPush: true,

        /* 请求消息推送接口的时间 */
        timeout: 10000,

        /* 消息推送的定时器 */
        msgTimer: null,

        /* 站内消息数据 */
        siteMsg: JSON.parse(localStorage.getItem("SITEMSG") || "[]"),

        /* 用户临时令牌 */
        token: localStorage.getItem("TOKEN") || "",

        /* 用户数据 */
        userInfo: JSON.parse(localStorage.getItem("USERINFO") || "{}"),

        /* 默认头像 */
        defaultIcon: "https://img0.baidu.com/it/u=974141393,2336151801&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1670864400&t=06ddc3cb36a29e78c3989ddb05732c6d"
    },

    /* 修改数据的API */
    mutations: {
        /* 更新用户数据 */
        UPDATEUSERINFO(state, userInfo) {
            state.userInfo = userInfo
            /* 保存本地 */
            this.commit("user/_save_user_info")
        },

        /* 保存用户数据 */
        _save_user_info(state) {
            localStorage.setItem("USERINFO", JSON.stringify(state.userInfo))
        },

        /* 更新用户jwt token验证 */
        UPDATETOKEN(state, token) {
            state.token = token
            localStorage.setItem("TOKEN", state.token)
        },

        /* 开通会员 更新用户数据 */
        OPENVIP(state) {
            /* 定义VIP对象 */
            //TODO VIP对象可以分到数据业务处理
            const vip = {
                opentime: Date.now(),
                losetime: 4102329600000,
                isvip: 1
            }
            /* 将这用户原始对象和vip对象合并 */
            state.userInfo = { ...state.userInfo, ...vip }
            /* 保存对象 */
            this.commit("user/_save_user_info")
        },

        /* 站内消息 */
        INSERTSITEMSG(state, message) {
            state.siteMsg.push(message)
            /* 保存站内信息到本地 */
            this.commit("user/_save_site_msg")
        },

        /* 更新某个消息 */
        UPDATESITEMSG(state, message) {

            //TODO 这里也可以放到数据处理业务
            let find = state.siteMsg.find(x => x["msgId"] === message["msgId"])/* 找到这个消息 */
            find = Object.assign({}, find, message)/* 因为这个消息过来的时候已经携带已读这个属性 所以直接合并 */
            state.siteMsg = state.siteMsg.filter(x => x["msgId"] !== find["msgId"])/* 然后过滤 */
            state.siteMsg.push(find)/* 然后再添加到消息末尾 */
            this.commit("user/_save_site_msg")/* 然后再保存本地 */
        },

        /* 删除某个消息 */
        DELETESITEMSG(state, message) {
            /* 直接过滤掉这个消息 */
            state.siteMsg = state.siteMsg.filter(x => x["msgId"] !== message["msgId"])
            this.commit("user/_save_site_msg")
        },

        /* 累加接收信息的时间 */
        INCTIMEOUT(state) {
            state.timeout += 1000
        },

        /* 保存站内信息 */
        _save_site_msg(state) {
            localStorage.setItem("SITEMSG", JSON.stringify(state.siteMsg))
        },

        /* 是否开启消息推送 */
        MSGPUSHDISABLED(state, value) {
            state.isMsgPush = value
        },

        /* 更新定时器 */
        UPDATEMSGTIMER(state, value) {
            state.msgTimer = value
        },

        /* 清空定时器 */
        CLEARMSGTIMER(state) {
            state.msgTimer = null
        },

        /* 消息全部已读业务处理 */
        READALLMSG(state) {
            state.siteMsg.forEach(x => {
                x.isRead = true
            })
            this.commit("user/_save_site_msg")
            const vm = this.state.music.vm
            vm.$message({ type: "success", message: "操作成功" })

        },

        /* 删除全部站内消息 */
        DELETEALLMSG(state) {
            const vm = this.state.music.vm
            if (!state.siteMsg.length) { vm.$message({ type: "error", message: "暂无消息可操作" }) }
            else {
                const loading = vm.$loading({
                    lock: true,
                    text: "正在清空全部消息...",
                    spinner: "el-icon-loading",
                    background: "rgba(0, 0, 0, 0.7)",
                    target: ".mine-msg"
                })
                setTimeout(() => {
                    state.siteMsg = []
                    this.commit("user/_save_site_msg")
                    vm.$message({ type: "success", message: "清空完成！" })
                    loading.close()
                }, 2000);
            }

        },

        /* 用户修改个人资料 */
        EDITUSERINFO(state, userInfo) {
            state.userInfo = { ...state.userInfo, ...userInfo }
            this.commit("user/_save_user_info")
        }
    },
    /* 数据业务处理API */
    actions: {
        /* 用户修改个人资料 */
        editUserInfo({ commit }, userInfo) {
            commit("EDITUSERINFO", userInfo)
            const vm = this.state.music.vm
            vm.$message({ message: "修改成功！", type: "success" })
        },

        /* 开启/关闭消息推送 */
        msgPushDisabled({ commit, state, dispatch }) {
            /* 判断是否开启消息推送 开启就关闭 关闭就开启*/
            if (state.isMsgPush) {
                commit("MSGPUSHDISABLED", false)
                const message = {
                    msgId: nanoid(),
                    date: Date.now(),
                    content: "关闭消息推送", isRead: false
                }
                /* 提交到订阅消息 */
                dispatch("insertSiteMsg", message)
            } else {
                commit("MSGPUSHDISABLED", true)
                const message = {
                    msgId: nanoid(),
                    date: Date.now(),
                    content: "开启消息推送", isRead: false
                }
                /* 提交到新增消息 */
                dispatch("insertSiteMsg", message)
            }
        },

        /* 站内消息 新增 */
        insertSiteMsg(context, message) {
            const vm = this.state.music.vm
            /* 提示并新增 */
            vm.$notify({
                customClass: "Notice",
                title: "站内消息",
                message: message.content,
                type: "info",
                position: "top-right",
                duration: 2000,
                onClick: () => {
                    if (vm.$router.history.current.path === "/mine/message")
                        return false;
                    vm.$router.push({
                        name: "msg"
                    })
                }
            });
            /* 提交接收订阅消息 */
            context.dispatch("receiveMsg")
            /* 提交到新增站内消息 */
            context.commit("INSERTSITEMSG", message)
        },

        /* 更新 站内消息 */
        updateSiteMsg({ commit, state }, message) {
            const vm = this.state.music.vm
            const find = state.siteMsg.find(x => x["msgId"] === message["msgId"])
            if (!find) return vm.$message({ message: "您正在操作一条不存在的消息", type: "error" });
            commit("UPDATESITEMSG", message)
        },

        /* 将消息设置为全部已读 */
        readAllMsg({ commit, getters }) {
            const vm = this.state.music.vm

            /* 先判断是否有未读的消息 */
            if (!getters["checkMsgReadAll"]) {
                const loading = vm.$loading({
                    lock: true,
                    text: "正在读取全部消息...",
                    spinner: "el-icon-loading",
                    background: "rgba(0, 0, 0, 0.7)",
                    target: ".mine-msg"
                })
                setTimeout(() => {
                    commit("READALLMSG")
                    loading.close()
                }, 2000);
            } else {
                vm.$message({ message: "消息列表里并没有新的消息" })
            }

        },

        /* 接收推送信息 */
        receiveMsg({ commit, dispatch, state, getters }) {
            /* 请求前先清空定时器 */
            commit("UPDATEMSGTIMER", null)
            /* 先判断用户有没有登录以及是否开启了消息订阅 */
            if (getters['isLogin'] && state['isMsgPush']) {
                const msgTimer = setTimeout(() => {

                    /* 发起请求 */
                    axios.get("http://api.btstu.cn/yan/api.php").then(
                        (res) => {
                            /* 整理消息 */
                            const message = {
                                msgId: nanoid(), content: res.data, isRead: false,
                                date: Date.now()
                            }
                            /* 先插入消息 */
                            dispatch("insertSiteMsg", message)
                            /* 在累加请求的间隔时间 */
                            commit("INCTIMEOUT")
                        },
                        (err) => {
                            /* 请求失败后 */
                            const message = {
                                msgId: nanoid(),
                                date: Date.now(),
                                content: "【花开富贵】，发来好友申请", isRead: false
                            }
                            /* 先插入消息 */
                            dispatch("insertSiteMsg", message)
                            /* 在累加请求的间隔时间 */
                            commit("INCTIMEOUT")
                            console.log(err);
                        }
                    );

                }, state.timeout)
                commit("UPDATEMSGTIMER", msgTimer)
            } else {
                commit("UPDATEMSGTIMER", null)
            }
        },

        /* 更新用户数据 */
        updateUserInfo(context, value) {
            if (JSON.stringify(value) === '{}') {
                context.commit("MSGPUSHDISABLED", false)
                context.commit("UPDATEMSGTIMER", null)
            } else {
                context.dispatch("insertSiteMsg", {
                    msgId: nanoid(),
                    content: `${value.name},欢迎回来！`,
                    isRead: false,
                    date: Date.now()
                })
            }
            context.commit("UPDATEUSERINFO", value)
        },

        /* 更新token */
        updateToken(context, value) {
            context.commit("UPDATETOKEN", value)
        },

        /* 开通会员 校验登录状态 生成订单 支付订单 完成订单 开通成功 更新用户信息*/
        openVip(context) {
            const vm = this.state.music.vm
            if (!context.getters.isLogin) return vm.$message({
                type: "error",
                message: "请先登录！"
            })
            const loading = vm.$loading({
                lock: true,
                text: "支付中...",
                spinner: "el-icon-loading",
                background: "rgba(0, 0, 0, 0.7)",
            })
            setTimeout(() => {
                loading.close()
                context.commit("OPENVIP")
                vm.$message({
                    message: "开通成功",
                    type: "success",
                    duration: 1000,
                })
            }, 2000)
        }
    },

    /* 计算属性 */
    getters: {
        /* 前端判断用户是否登录 */
        isLogin(state) {
            return state.userInfo === "{}" || state.token === "" ? false : true
        },

        /* 前端判断用户是否为会员 */
        isVip(state) {
            return state.userInfo && state.userInfo.isvip ? true : false
        },

        /* 反转消息 */
        reverseSiteMsg(state) {
            return state.siteMsg.reverse()
        },

        /* 消息排序 */
        sortSiteMsg(state) {
            function createComprisonFunction(propertyName) {
                return function (object1, object2) {
                    var value1 = object1[propertyName];
                    var value2 = object2[propertyName];
                    if (value1 < value2) {
                        return -1;
                    } else if (value1 > value2) {
                        return 1;
                    } else {
                        return 0;
                    }
                }
            }
            return state.siteMsg.sort(createComprisonFunction("date"))

        },

        /* 检测消息是否全部已读 */
        checkMsgReadAll(state) {
            const length = state.siteMsg.length
            const arr = []
            state.siteMsg.forEach(x => {
                if (x.isRead)
                    arr.push(x)
            })
            return arr.length === length ? true : false
        }
    }
}